#include "cstdlib"
#include <unistd.h>
#include <cstdio>
#include <sys/types.h>

#include <string>
#include <iostream>
#include <dirent.h>
#include <sys/stat.h>
#include <list>
#include <utility>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <map>
#include <sstream>
#include "ctime"
#include "time.h"
#include "Defines.h"

using namespace std;

//Estructura utilizada para almacenar los datos de cada elemento gráfico en pantalla
struct destinoSprite
 {
    unsigned char nombre; //Ids definidos en Define.h. Se utiliza para saber que sprite recortar en la imagen origen
    SDL_Rect destino; //Punto de ubicacion del elemento en pantalla
 };

//Estructura utilizada en el protocolo de comunicacion con el Servidor de Partida
struct accion
 {
    unsigned short int id_accion; //Que accion se hace referencia
    unsigned short int id_entidad; //A que elemento afecta directamente
    int mov_x; //Para la accion Mover, offset x
    int mov_y; //Para la accion Mover, offset y
    char nombre[10];
 };

//Funcion de equivalencia id_identidad --> m[x][y]
SDL_Rect idEntidadToXy(unsigned short int id_entidad, unsigned short int tramo);

//Funciones de SDL
int SDLA_esperarTecla();
void procesarEventoSDL(destinoSprite m[53][10], map<int, int> contr,bool *estoyVivo,unsigned short int *miIdJugador,char miNombre[10]);
void procesarEventoSDLQuit(void);
void procesarEventoSDLKeyDown(SDL_Event* event,destinoSprite m[53][10], map<int, int> contr,bool *estoyVivo,unsigned short int *miIdJugador,char miNombre[10]);
SDL_Rect obtenerOrigenSprite(unsigned char nombre);
void dibujarMatriz(destinoSprite matriz[53][10],SDL_Surface *pantalla, SDL_Surface *imagen1,SDL_Surface *imagen2);


//Acciones a realizar ante un mensaje enviado por el Servidor de Partida
void procesarAccion(accion accion,unsigned short int tramo,destinoSprite m[53][10],bool *estoyVivo,unsigned short int *miIdJugador,char miNombre[10]);
void moverElemento(accion accion, unsigned short int tramo,destinoSprite m[53][10],unsigned short int *miIdJugador);
void repararElemento(accion accion,unsigned short int tramo, destinoSprite m[53][10]);
void salirTorneo(accion accion,destinoSprite m[53][10]);
void perderPartida(accion accion,destinoSprite m[53][10],bool *estoyVivo,unsigned short int *miIdJugador);

void restarVida(accion accion,destinoSprite m[53][10]);
     unsigned char obtenerVidas(unsigned short int jugador,destinoSprite m[53][10]);
     void decrementarVidas(unsigned char *vidas);
     void cargarVidas(unsigned char vidas, unsigned short int jugador, destinoSprite m[53][10]);
void actualizarPuntaje(accion accion,destinoSprite m[53][10]);
	  string obtenerPuntaje(unsigned short int jugador,destinoSprite m[53][10]);
      void incrementarPuntaje(string *puntaje,unsigned char puntajeVidrioReparado);
      void cargarPuntaje(string puntaje, unsigned short int jugador, destinoSprite m[53][10]);
void actualizarRanking(accion accion,destinoSprite m[53][10]);
void inicializarNivel(accion accion,destinoSprite m[53][10]);
unsigned int obtenerNivel(destinoSprite m[53][10]);
unsigned int obtenerNumero(unsigned char letra);
void incrementarNivel(destinoSprite m[53][10]);

void inicializarTramo(accion accion,destinoSprite m[53][10]);
void sortearVidrios(accion accion,destinoSprite m[53][10]);
void sortearBloqueos(accion accion,destinoSprite m[53][10]);
unsigned char sortearEstadoBloqueo(int i, unsigned char tipoBloqueo);
void quitarBloqueosParaJugar(unsigned char tipoBloqueo,destinoSprite m[53][10],accion accion);
void quitarBloqueoHorizontal(unsigned char tipoBloqueo,destinoSprite m[53][10],accion accion);
void quitarBloqueoVertical(unsigned char tipoBloqueo,destinoSprite m[53][10],accion accion);
unsigned short int getIdBaseBloqueo(unsigned char tipoBloqueo, int fila);

void crearTorta(accion accion,unsigned short int tramo,destinoSprite m[53][10]);
void eliminarTorta(destinoSprite m[53][10]);
void crearAve(accion accion,destinoSprite m[53][10]);
void eliminarAve(destinoSprite m[53][10]);
void crearLadrillo(accion accion,destinoSprite m[53][10]);
void eliminarLadrillo(accion accion,destinoSprite m[53][10]);
void inicializarPartida(accion accion,destinoSprite m[53][10],unsigned short int *miIdJugador,char miNombre[10]);
void finTramo(accion accion,destinoSprite m[53][10]);

void terminarPartida();
void cargarNombre(string nombre, unsigned short int jugador, destinoSprite m[53][10]);
void cargarNivel(string nombre, destinoSprite m[53][10]);

unsigned short int obtenerTramo(destinoSprite m[53][10]);
void animarTortas(destinoSprite m[53][10]);
//void inicializarNivel(string nivel,destinoSprite m[53][10]);


//Utilitarios
string upcase(string s1);
string corregirNombre(string nombre);

unsigned char obtenerIdCaracter(unsigned short int jugador,char letra);
char obtenerCaracter(unsigned char idCaracter);
unsigned char obtenerIdNumero(unsigned short int numero);
